package org.crystal.tradecraft.model.binance.enumeration;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.crystal.tradecraft.model.binance.market.filter.BinanceFilter;
import org.crystal.tradecraft.model.binance.market.filter.ExchangeMaxNumAlgoOrders;
import org.crystal.tradecraft.model.binance.market.filter.ExchangeMaxNumIcebergOrders;
import org.crystal.tradecraft.model.binance.market.filter.ExchangeMaxNumOrders;
import org.crystal.tradecraft.model.binance.market.filter.IcebergParts;
import org.crystal.tradecraft.model.binance.market.filter.LotSize;
import org.crystal.tradecraft.model.binance.market.filter.MarketLotSize;
import org.crystal.tradecraft.model.binance.market.filter.MaxNumAlgoOrders;
import org.crystal.tradecraft.model.binance.market.filter.MaxNumIcebergOrders;
import org.crystal.tradecraft.model.binance.market.filter.MaxNumOrders;
import org.crystal.tradecraft.model.binance.market.filter.MaxPosition;
import org.crystal.tradecraft.model.binance.market.filter.MinNotional;
import org.crystal.tradecraft.model.binance.market.filter.Notional;
import org.crystal.tradecraft.model.binance.market.filter.PercentPrice;
import org.crystal.tradecraft.model.binance.market.filter.PercentPriceBySide;
import org.crystal.tradecraft.model.binance.market.filter.PriceFilter;
import org.crystal.tradecraft.model.binance.market.filter.TrailingDelta;

@Getter
@RequiredArgsConstructor
public enum FilterType {
    // Symbol filters
    PRICE_FILTER(PriceFilter.class),
    PERCENT_PRICE(PercentPrice.class),
    PERCENT_PRICE_BY_SIDE(PercentPriceBySide.class),
    LOT_SIZE(LotSize.class),
    MIN_NOTIONAL(MinNotional.class),
    NOTIONAL(Notional.class),
    ICEBERG_PARTS(IcebergParts.class),
    MARKET_LOT_SIZE(MarketLotSize.class),
    MAX_NUM_ORDERS(MaxNumOrders.class),
    MAX_NUM_ALGO_ORDERS(MaxNumAlgoOrders.class),
    MAX_NUM_ICEBERG_ORDERS(MaxNumIcebergOrders.class),
    MAX_POSITION(MaxPosition.class),
    TRAILING_DELTA(TrailingDelta.class),
    // Exchange Filters
    EXCHANGE_MAX_NUM_ORDERS(ExchangeMaxNumOrders.class),
    EXCHANGE_MAX_NUM_ALGO_ORDERS(ExchangeMaxNumAlgoOrders.class),
    EXCHANGE_MAX_NUM_ICEBERG_ORDERS(ExchangeMaxNumIcebergOrders.class);

    private final Class<? extends BinanceFilter> filterClass;
}
